package main

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
)

/**
 * https://blog.csdn.net/ayqy42602/article/details/107780136
 * _, err = c.Do("SET", "mykey", "superWang") 存
 * username, err := redis.String(c.Do("GET", "mykey")) 取
 * _, err = c.Do("SET", "mykey", "superWang", "EX", "5") 设置超时
 * is_key_exit, err := redis.Bool(c.Do("EXISTS", "mykey1")) 判断是否存在
 * _, err = c.Do("DEL", "mykey") 删除
 * _, err = c.Do("lpush", "runoobkey", "redis") 列表操作
 * values, _ := redis.Values(c.Do("lrange", "runoobkey", "0", "100")) 列表读
 */
func main() {
	//通过go 连接redis 写入数据和读取数据
	//1.连接redis
	conn, err := redis.Dial("tcp", "172.16.10.46:6379")
	if err != nil {
		fmt.Println("redis.Dail err=", err)
		return
	}
	//4、关闭redis连接
	defer conn.Close()
	/*
	 *	String存取
	 */
	fmt.Println("conn succ...", conn)
	_, err = conn.Do("Set", "name", "邹哲明")
	if err != nil {
		fmt.Println("redis.Dial err=", err)
		return
	}
	//3、通过go 向redis读取数据 string [key-val]
	r, err := redis.String(conn.Do("Get", "name"))
	if err != nil {
		fmt.Println("redis.Dial err=", err)
		return
	}
	fmt.Println("操作ok", r)
	/*
	 *	Hash存取
	 */
	//2、通过go 向redis写入数据
	_, err = conn.Do("HSet", "user01", "name", "john")
	if err != nil {
		fmt.Println("HSet err=", err)
		return
	}
	_, err = conn.Do("HSet", "user01", "age", 18)
	if err != nil {
		fmt.Println("HSet err=", err)
		return
	}
	//3、通过go 向redis读取数据
	//因为返回 r 是 interface{}
	//因为 name 对应的值是string，因此我们需要转换
	r1, err := redis.String(conn.Do("HGet", "user01", "name"))
	if err != nil {
		fmt.Println("HGet err=", err)
		return
	}
	r2, err := redis.Int(conn.Do("HGet", "user01", "age"))
	if err != nil {
		fmt.Println("HGet err=", err)
		return
	}
	fmt.Printf("操作ok r1=%v r2=%v\n", r1, r2)
	/*
	 *	同时存取多条Hash数据
	 */
	//2、通过go 向redis写入数据
	_, err = conn.Do("HMSet", "user01", "name", "john", "age", 18)
	if err != nil {
		fmt.Println("HSet err=", err)
		return
	}

	//3、通过go 向redis读取数据
	//因为返回 r 是 interface{}
	//因为 name 对应的值是string，因此我们需要转换
	r3, err := redis.Strings(conn.Do("HMGet", "user01", "name", "age"))
	if err != nil {
		fmt.Println("HGet err=", err)
		return
	}
	fmt.Printf("操作ok r3=%v\n", r3)
}
